/*
 * ParametrosDificultad.cpp
 *
 *  Created on: 24/06/2014
 *      Author: Abraham Alan Panuccio
 */

#include "ParametrosDificultad.h"

using namespace std;

ParametrosDificultad *ParametrosDificultad::instance = NULL;

ParametrosDificultad::ParametrosDificultad(){
	dificultad d;
	d.maxMovSinLanzar		= MV_SIN_LANZ_IN;
	d.MaxCiclosSinAves		= CC_SIN_AVES_IN;
	d.maxCiclosSinTortas	= CC_SIN_TORTAS_IN;
	d.cantBloqueosAQuitarH	= CN_BQH_QUITAR_IN;
	d.cantBloqueosAQuitarV	= CN_BQV_QUITAR_IN;
	d.cantTramosNivelActual = CN_TRAMOS_LVL1;

	instance->mapaParametros.push_back(d);

	dificultad d2;
	d2.maxMovSinLanzar		= MV_SIN_LANZ_IN - DEC_SIN_LANZ;
	d2.MaxCiclosSinAves		= CC_SIN_AVES_IN - DEC_SIN_AVES;
	d2.maxCiclosSinTortas	= CC_SIN_TORTAS_IN - DEC_SIN_TORTAS;
	d2.cantBloqueosAQuitarH	= (CN_BQH_QUITAR_IN - DEC_BQH_QUITAR)<CONST_UNO?CONST_UNO:(CN_BQH_QUITAR_IN - DEC_BQH_QUITAR);
	d2.cantBloqueosAQuitarV	= (CN_BQV_QUITAR_IN - DEC_BQV_QUITAR)<CONST_UNO?CONST_UNO:(CN_BQV_QUITAR_IN - DEC_BQV_QUITAR);
	d2.cantTramosNivelActual = CN_TRAMOS_LVL2;

	instance->mapaParametros.push_back(d2);

	dificultad d3;
	d3.maxMovSinLanzar		=  d2.maxMovSinLanzar 		- DEC_SIN_LANZ;
	d3.MaxCiclosSinAves		=  d2.MaxCiclosSinAves		- DEC_SIN_AVES;
	d3.maxCiclosSinTortas	=  d2.maxCiclosSinTortas	- DEC_SIN_TORTAS;
	d3.cantBloqueosAQuitarH	= (d2.cantBloqueosAQuitarH- DEC_BQH_QUITAR)<CONST_UNO?CONST_UNO:(d2.cantBloqueosAQuitarH - DEC_BQH_QUITAR);
	d3.cantBloqueosAQuitarV	= (d2.cantBloqueosAQuitarV - DEC_BQV_QUITAR)<CONST_UNO?CONST_UNO:(d2.cantBloqueosAQuitarV - DEC_BQV_QUITAR);
	d3.cantTramosNivelActual = CN_TRAMOS_LVL3;

	instance->mapaParametros.push_back(d3);
}

ParametrosDificultad::~ParametrosDificultad(){
}

/*Retorna la instancia si existe, sino la crea y la retorna.*/
ParametrosDificultad *ParametrosDificultad::getInstance(){
	if(!instance)
		instance = new ParametrosDificultad();

	return instance;
}

/* Busca los parametros que definen la dificultad del nivel indicado y los setea en las variables parametros */
void ParametrosDificultad::setParmsPorNivel(unsigned short int nivel, int *maxMovSinLanzar,
											int *MaxCiclosSinAves, int *cantBloqueosAQuitarH,
											int *cantBloqueosAQuitarV, int *maxCiclosSinTortas,
											int *cantTramosNivelActual){
	/* Como del nivel 3 para arriba tienen todos la misma dificultad, reuso el indice */
	unsigned short int indice = nivel;
	if(indice > CONST_TRES)
		indice = CONST_TRES;

	std::vector<dificultad>::iterator it = mapaParametros.begin();
	std::advance(it, indice);
	dificultad d = (*it);

	*maxMovSinLanzar = d.maxMovSinLanzar;
	*MaxCiclosSinAves = d.MaxCiclosSinAves;
	*cantBloqueosAQuitarH = d.cantBloqueosAQuitarH;
	*cantBloqueosAQuitarV = d.cantBloqueosAQuitarV;
	*maxCiclosSinTortas = d.maxCiclosSinTortas;
	*cantTramosNivelActual = d.cantTramosNivelActual;
}

